<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // function Student(name,age){
        //     this.name=name;
        //     this.age=age;
        //     this.show=function(){
        //         console.log("我是一个学生，我的名字是:"+this.name);
        //     };
        //     this.sayHello=function(){
        //         console.log("hello");
        //     };
        //     this.sayGoodBye=function(){
        //         console.log("bye");
        //     };
        // }
        // var stu1=new Student("alice",20);
        // stu1.show();
        // stu1.sayHello();
        // stu1.sayGoodBye();
        // var stu2=new Student("alice",20);
        // stu2.show();
        // stu2.sayHello();
        // stu2.sayGoodBye();
        // console.log(stu1===stu2);//false
        // console.log(stu1.name===stu2.name);//true
        // console.log(stu1.sayHello===stu2.sayHello);//false
        // console.log(stu1.sayGoodBye===stu2.sayGoodBye);//false

        // stu1.sayHello、stu2.sayHello  分别使用不同的内存空间，都需要占用资源，但是其输出内容是一致的，为了节省内存空间，希望能够共用
        // stu1.sayGoodBye、stu2.sayGoodBye分别使用不同的内存空间，都需要占用资源，但是其输出内容是一致的，为了节省内存空间，希望能够共用

        function Student(name,age){
            this.name=name;
            this.age=age;
            this.show=function(){
                console.log("我是一个学生，我的名字是:"+this.name);
            };
          
        }

        // 所有函数都有一个prototype属性
        // prototype原型(原始的数据模型)：js环境中一个数据构成时候所参考的数据结构模板
        // console.log(Student.prototype);//这个属性值是个对象，称之为原型对象

        // 可以通过prototype来添加新的属性和方法，此时所有该构造函数创建的对象都会具有这些属性和方法

        // 构造函数名称.prototype.属性名=属性值
        // 构造函数名称.prototype.方法名=函数
        Student.prototype.sex="男";//向原型对象中添加属性
        Student.prototype.hobby="唱歌";//向原型对象中添加属性
        Student.prototype.sayHello=function(){//向原型对象中添加方法
            console.log("hello");
        };
        Student.prototype.sayGoodBye=function(){
            console.log("bye");
        };
        // console.log(Student.prototype);
        /* 访问对象属性时查找顺序:
            1.首先在当前对象中查找
            2.如果没有，就会到该对象关联的构造函数的prototype属性中找，即到原型对象中查找 */



        var stu=new Student("aa",20);
        stu.sex="女";//为stu这个对象添加一个sex
        console.log(stu.sex);
        console.log(stu.hobby);
        stu.sayHello();
        stu.sayGoodBye();

        var stu2=new Student("aa",20);
        console.log(stu2.sex);
        console.log(stu2.hobby);
        stu2.sayHello();
        stu2.sayGoodBye();
        console.log(stu.sayHello===stu2.sayHello);//true
        console.log(stu.sayGoodBye===stu2.sayGoodBye);//true
        console.log(stu,stu2);

      
        
        //为数组添加一个共享的方法
        Array.prototype.selectString=function(){
            var count=0;
            for(var i=0;i<this.length;i++){//this指的是调用者
                if(typeof this[i] == "string"){
                    count++;
                }
            }
            return count;
        };

        // console.log(Array.prototype);
        var arrs=[10,20,"aa",34];
        var c=arrs.selectString();
        console.log(c);
        var arrs2=new Array("99","aa","cc");
        console.log(arrs2.selectString());

    </script>
</head>
<body>
    
</body>
</html>